package com.monitor.log;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 屏幕抓拍工具，用于定时截取屏幕并保存
 */
public class ScreenCapture {
    private static final DateTimeFormatter FILE_NAME_FORMATTER = 
            DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");
    private String saveDirectory;
    private int captureInterval; // 截图间隔，单位分钟
    private int retentionDays; // 保留天数
    private boolean isRunning;
    private Thread captureThread;
    
    public ScreenCapture() {
        // 默认设置
        this.saveDirectory = System.getProperty("user.home") + File.separator + "ScreenCaptures";
        this.captureInterval = 5; // 默认5分钟截图一次
        this.retentionDays = 7; // 默认保留7天
        this.isRunning = false;
        
        // 确保保存目录存在
        File dir = new File(saveDirectory);
        if (!dir.exists()) {
            dir.mkdirs();
        }
    }
    
    /**
     * 开始屏幕抓拍
     */
    public void start() {
        if (isRunning) {
            return;
        }
        
        isRunning = true;
        captureThread = new Thread(() -> {
            while (isRunning) {
                try {
                    captureScreen();
                    cleanupOldCaptures();
                    // 等待指定的间隔时间
                    Thread.sleep(captureInterval * 60 * 1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        
        captureThread.setDaemon(true); // 设置为守护线程
        captureThread.start();
    }
    
    /**
     * 停止屏幕抓拍
     */
    public void stop() {
        isRunning = false;
        if (captureThread != null) {
            captureThread.interrupt();
        }
    }
    
    /**
     * 执行屏幕截图
     */
    private void captureScreen() {
        try {
            // 获取默认屏幕设备
            Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            
            // 创建屏幕截图
            BufferedImage capture = new Robot().createScreenCapture(screenRect);
            
            // 生成文件名
            String fileName = "capture_" + LocalDateTime.now().format(FILE_NAME_FORMATTER) + ".png";
            File outputFile = new File(saveDirectory, fileName);
            
            // 保存截图
            ImageIO.write(capture, "png", outputFile);
            
            System.out.println("屏幕截图已保存: " + outputFile.getAbsolutePath());
            
        } catch (AWTException | IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 清理过期的截图
     */
    private void cleanupOldCaptures() {
        File dir = new File(saveDirectory);
        if (!dir.exists() || !dir.isDirectory()) {
            return;
        }
        
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        
        // 遍历目录中的所有文件
        File[] files = dir.listFiles((d, name) -> name.startsWith("capture_") && name.endsWith(".png"));
        if (files != null) {
            for (File file : files) {
                try {
                    // 从文件名中提取日期时间
                    String dateStr = file.getName().substring(8, 23); // capture_20220101_120000.png
                    LocalDateTime fileDate = LocalDateTime.parse(dateStr, FILE_NAME_FORMATTER);
                    
                    // 如果文件超过保留天数，则删除
                    if (fileDate.plusDays(retentionDays).isBefore(now)) {
                        if (file.delete()) {
                            System.out.println("已删除过期截图: " + file.getName());
                        }
                    }
                } catch (Exception e) {
                    // 如果解析文件名失败，忽略该文件
                    e.printStackTrace();
                }
            }
        }
    }
    
    /**
     * 设置截图保存目录
     * @param directory 保存目录路径
     */
    public void setSaveDirectory(String directory) {
        this.saveDirectory = directory;
        File dir = new File(saveDirectory);
        if (!dir.exists()) {
            dir.mkdirs();
        }
    }
    
    /**
     * 设置截图间隔时间
     * @param minutes 间隔分钟数（1-14）
     */
    public void setCaptureInterval(int minutes) {
        if (minutes >= 1 && minutes <= 14) {
            this.captureInterval = minutes;
        }
    }
    
    /**
     * 设置截图保留天数
     * @param days 保留天数（最长14天）
     */
    public void setRetentionDays(int days) {
        if (days >= 1 && days <= 14) {
            this.retentionDays = days;
        }
    }
    
    /**
     * 获取当前截图间隔时间
     * @return 间隔分钟数
     */
    public int getCaptureInterval() {
        return captureInterval;
    }
    
    /**
     * 获取当前截图保留天数
     * @return 保留天数
     */
    public int getRetentionDays() {
        return retentionDays;
    }
    
    /**
     * 获取截图保存目录
     * @return 保存目录路径
     */
    public String getSaveDirectory() {
        return saveDirectory;
    }
    
    /**
     * 检查截图功能是否正在运行
     * @return 如果正在运行返回true
     */
    public boolean isRunning() {
        return isRunning;
    }
}